package medium.动态规划;

/**
 * <a href="https://leetcode.cn/problems/delete-and-earn/?envType=study-plan-v2&envId=dynamic-programming">740. 删除并获得点数</a>
 * 给你一个整数数组 nums ，你可以对它进行一些操作。
 * 每次操作中，选择任意一个 nums[i] ，删除它并获得 nums[i] 的点数。之后，你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。
 * 开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。
 * 示例 1：
 *   输入：nums = [3,4,2]
 *   输出：6
 *   解释：
 *     删除 4 获得 4 个点数，因此 3 也被删除。
 *     之后，删除 2 获得 2 个点数。总共获得 6 个点数。
 * 示例 2：
 *   输入：nums = [2,2,3,3,3,4]
 *   输出：9
 *   解释：
 *     删除 3 获得 3 个点数，接着要删除两个 2 和 4 。
 *     之后，再次删除 3 获得 3 个点数，再次删除 3 获得 3 个点数。
 *     总共获得 9 个点数。
 * 提示：
 *   1 <= nums.length <= 2 * 10^4
 *   1 <= nums[i] <= 10^4
 * @author 刘学松
 * @date 2023-05-30 11:19
 */
public class 删除并获得点数 {
    public int deleteAndEarn(int[] nums) {
        int max = 0;
        for (int num : nums) {
            if (num > max) {
                max = num;
            }
        }
        int[] arr = new int[max + 1];
        for (int num : nums) {
            arr[num] += num;
        }
        if (arr.length == 2) {
            return Math.max(arr[0], arr[1]);
        }
        int num0 = arr[0];
        int num1 = Math.max(arr[0], arr[1]);
        for (int i = 2; i < arr.length; i++) {
            int num = Math.max(num0 + arr[i], num1);
            num0 = num1;
            num1 = num;
        }
        return num1;
    }
}
